
import  wx
import  wx.grid as  gridlib
import numpy

#---------------------------------------------------------------------------

class ArrayTable(gridlib.PyGridTableBase):

    def __init__(self, ary):
        gridlib.PyGridTableBase.__init__(self)
        self.ary = ary

        self.odd=gridlib.GridCellAttr()
        self.odd.SetBackgroundColour("white")
        self.even=gridlib.GridCellAttr()
        self.even.SetBackgroundColour("white")

    def GetAttr(self, row, col, kind):
        attr = [self.even, self.odd][row % 2]
        attr.IncRef()
        return attr


    
    # This is all it takes to make a custom data table to plug into a
    # wxGrid.  There are many more methods that can be overridden, but
    # the ones shown below are the required ones.  This table simply
    # provides strings containing the row and column values.
    
    def GetNumberRows(self):
        return len(self.ary)

    def GetNumberCols(self):
        return len(self.ary[0])

    def IsEmptyCell(self, row, col):
        return False

    def GetValue(self, row, col):
        return self.ary[row, col]

    def SetValue(self, row, col, value):
        self.ary[row, col] = eval(value)


#---------------------------------------------------------------------------



class ArrayGrid(gridlib.Grid):
    def __init__(self, parent, ary):
        gridlib.Grid.__init__(self, parent, -1)

        table = ArrayTable(ary)

        # The second parameter means that the grid is to take ownership of the
        # table and will destroy it when done.  Otherwise you would need to keep
        # a reference to it and call it's Destroy method later.
        self.SetTable(table, True)

        self.Bind(gridlib.EVT_GRID_CELL_RIGHT_CLICK, self.OnRightDown)  

    def OnRightDown(self, event):
        print "hello"
        print self.GetSelectedRows()


#---------------------------------------------------------------------------

class TestFrame(wx.Frame):
    def __init__(self, parent, log):
        wx.Frame.__init__(self, parent, -1, "Huge (virtual) Table Demo", size=(640,480))
        a = numpy.array(range(1000000))
        a.shape = (1000, 1000)
        grid = ArrayGrid(self, a)

        grid.SetReadOnly(5,5, True)

#---------------------------------------------------------------------------

if __name__ == '__main__':
    import sys
    app = wx.PySimpleApp()
    frame = TestFrame(None, sys.stdout)
    frame.Show(True)
    app.MainLoop()


#---------------------------------------------------------------------------
